package com.wenx.v3system.modular.oauth.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;

/**
 * OAuth2令牌响应DTO
 * 标准OAuth2令牌响应格式
 * 
 * @author wenx
 */
@Data
public class OAuth2TokenDto implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 访问令牌
     */
    @JsonProperty("access_token")
    private String accessToken;

    /**
     * 令牌类型（通常为"Bearer"）
     */
    @JsonProperty("token_type")
    private String tokenType = "Bearer";

    /**
     * 刷新令牌
     */
    @JsonProperty("refresh_token")
    private String refreshToken;

    /**
     * 令牌过期时间（秒）
     */
    @JsonProperty("expires_in")
    private Long expiresIn;

    /**
     * 授权范围
     */
    @JsonProperty("scope")
    private String scope;

    /**
     * JWT ID（如果使用JWT令牌）
     */
    @JsonProperty("jti")
    private String jti;

    /**
     * 用户ID
     */
    @JsonProperty("user_id")
    private Long userId;

    /**
     * 用户名
     */
    @JsonProperty("username")
    private String username;

    /**
     * 客户端ID
     */
    @JsonProperty("client_id")
    private String clientId;

    /**
     * 权限列表
     */
    @JsonProperty("authorities")
    private String authorities;

    /**
     * 令牌生成时间戳
     */
    @JsonProperty("iat")
    private Long issuedAt;

    /**
     * 令牌过期时间戳
     */
    @JsonProperty("exp")
    private Long expiration;

    /**
     * 检查令牌是否过期
     */
    public boolean isExpired() {
        if (expiration == null) {
            return false;
        }
        return System.currentTimeMillis() / 1000 > expiration;
    }

    /**
     * 获取剩余有效时间（秒）
     */
    public long getRemainingTime() {
        if (expiration == null) {
            return expiresIn != null ? expiresIn : 0;
        }
        long remaining = expiration - (System.currentTimeMillis() / 1000);
        return Math.max(0, remaining);
    }
}
